<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>significant_terms 聚合 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-aggregations-bucket-significantterms-aggregation.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-bucket-significantterms-aggregation.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-bucket-significantterms-aggregation.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-aggregations-bucket-significantterms-aggregation.html" rel="nofollow" target="_blank">../en/search-aggregations-bucket-significantterms-aggregation.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations-bucket.html">桶(bucket)聚合</a></span>
»
<span class="breadcrumb-node">significant_terms 聚合</span>
</div>
<div class="navheader">
<span class="prev">
<a href="search-aggregations-bucket-sampler-aggregation.html">« sampler 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-bucket-significanttext-aggregation.html">significant_text 聚合 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-aggregations-bucket-significantterms-aggregation"></a>重要词项(significant_terms)聚合
</h2>
</div></div></div>
<p>一种聚合，返回集合中有趣或不寻常的词项的聚合。</p>
<div class="ulist itemizedlist">
<p class="title"><strong>用例示例：</strong></p>
<ul class="itemizedlist">
<li class="listitem">
当用户在文本中搜索“禽流感”时，提示“H5N1”
</li>
<li class="listitem">
从信用卡持有人挂失的交易历史中确定“妥协点”的商家
</li>
<li class="listitem">
为自动新闻分类器建议与股票代码$ATI相关的关键词
</li>
<li class="listitem">
发现那个诊断出更多鞭伤的骗子医生
</li>
<li class="listitem">
发现爆胎数量不成比例的轮胎制造商
</li>
</ul>
</div>
<p>
在这几种情况下，被选择的词项不仅仅都是一组最流行的词项。

它们是在<em>前景(foreground)</em>和<em>背景(background)</em>集之间受欢迎程度发生了显著变化的词项。

如果词项“H5N1”仅存在于1000万个文档索引中的5个文档中，但是在构成用户搜索结果的100个文档中的4个中出现，则这是重要的并且可能与他们的搜索非常相关。

频率 5/10,000,000 与 4/100 相比差别很大。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_single_set_analysis"></a>单个集合分析(Single-set analysis)
</h3>
</div></div></div>
<p>
在最简单的情况下，感兴趣的<em>前景(foreground)</em>集是与查询匹配的搜索结果，而用于统计比较的<em>背景(background)</em>集则是从中收集结果的一个或多个索引。
</p>
<p>示例：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query" : {
        "terms" : {"force" : [ "British Transport Police" ]}
    },
    "aggregations" : {
        "significant_crime_types" : {
            "significant_terms" : { "field" : "crime_type" }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/511.console"></div>
<p>响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
    ...
    "aggregations" : {
        "significant_crime_types" : {
            "doc_count": 47347,
            "bg_count": 5064554,
            "buckets" : [
                {
                    "key": "Bicycle theft",
                    "doc_count": 3640,
                    "score": 0.371235374214817,
                    "bg_count": 66799
                }
                ...
            ]
        }
    }
}</pre>
</div>
<p>
当查询一个所有警察部队的所有犯罪的索引时，这些结果表明，英国交通警察部队（British Transport Police）在处理不成比例的大量自行车盗窃案件中表现突出。

通常情况下，自行车盗窃只占犯罪的1%(66799/5064554)，但对于负责处理铁路和车站犯罪的英国交通警察来说，7%的犯罪(3640/47347)是自行车盗窃。

这在频率上显著增加了七倍，因此这种异常被强调为最常见的犯罪类型。
</p>
<p>
用查询来发现异常的问题是，它只给了我们一个用于比较的子集。

为了发现所有其他警察部队的异常情况，我们必须对每个不同的部队重复查询。
</p>
<p>这可能是一种在索引中寻找不寻常模式的乏味方法 </p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_multi_set_analysis"></a>多个集合分析(Multi-set analysis)
</h3>
</div></div></div>
<p>跨多个类别执行分析的一种更简单的方法是使用父级聚合对数据进行分段，以便进行分析。</p>
<p>使用父聚合进行分段的示例：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "aggregations": {
        "forces": {
            "terms": {"field": "force"},
            "aggregations": {
                "significant_crime_types": {
                    "significant_terms": {"field": "crime_type"}
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/512.console"></div>
<p>响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
 ...
 "aggregations": {
    "forces": {
        "doc_count_error_upper_bound": 1375,
        "sum_other_doc_count": 7879845,
        "buckets": [
            {
                "key": "Metropolitan Police Service",
                "doc_count": 894038,
                "significant_crime_types": {
                    "doc_count": 894038,
                    "bg_count": 5064554,
                    "buckets": [
                        {
                            "key": "Robbery",
                            "doc_count": 27617,
                            "score": 0.0599,
                            "bg_count": 53182
                        }
                        ...
                    ]
                }
            },
            {
                "key": "British Transport Police",
                "doc_count": 47347,
                "significant_crime_types": {
                    "doc_count": 47347,
                    "bg_count": 5064554,
                    "buckets": [
                        {
                            "key": "Bicycle theft",
                            "doc_count": 3640,
                            "score": 0.371,
                            "bg_count": 66799
                        }
                        ...
                    ]
                }
            }
        ]
    }
  }
}</pre>
</div>
<p>现在，我们只需一个请求，就可以对每支警察部队进行异常检测。</p>
<p>我们可以使用其他形式的顶级聚合来划分数据，例如按地理区域划分，以识别特定犯罪类型的异常热点：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "aggs": {
        "hotspots": {
            "geohash_grid": {
                "field": "location",
                "precision": 5
            },
            "aggs": {
                "significant_crime_types": {
                    "significant_terms": {"field": "crime_type"}
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/513.console"></div>
<p>上面这个示例使用<code class="literal">geohash_grid</code>聚合来创建代表地理区域的结果桶，在每个桶中，我们可以识别这些高度集中的区域中犯罪类型的异常级别，例如：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
机场缴获武器的数量之多的异常
</li>
<li class="listitem">
大学里自行车盗窃的上升趋势
</li>
</ul>
</div>
<p>在更高的geohash_grid缩放级别和更大的覆盖区域，我们将开始看到整个警察部队可能正在处理特定犯罪类型的异常数量。</p>
<p>
显然，基于时间的顶级分段将有助于识别每个时间点的当前趋势，其中简单的<code class="literal">terms</code>聚合通常会显示在所有时间段持续存在的非常流行的“常数(constants)”。
</p>
<div class="sidebar">
<div class="titlepage"><div><div>
<p class="title"><strong>分数是如何计算的?</strong></p>
</div></div></div>
<p>
返回的分数主要是为了对不同的建议进行合理的排名，而不是为了让最终用户容易理解。

分数是从<em>前景(foreground)</em>和<em>背景(background)</em>集中的文档频率得出的。

简而言之，如果一个词项在子集和背景中出现的频率有显著差异，则认为该词项是重要的。

可以配置术语的排列方式，请参见“参数”部分。
</p>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_use_on_free_text_fields"></a>在自定义文本(free-text)字段上使用
</h3>
</div></div></div>
<p>significant_terms聚合可以有效地用于词元化(tokenized)的自定义文本(free-text)字段，以建议：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
优化最终用户搜索的关键字
</li>
<li class="listitem">
用于percolator查询的关键字
</li>
</ul>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
选择一个自定义文本(free-text)作为重要词项分析的主题的成本可能会很高！

它会尝试将每个唯一的词加载到内存中。

建议仅在较小的索引上使用此选项。 
</p>
</div>
</div>
<div class="sidebar">
<div class="titlepage"><div><div>
<p class="title"><strong>使用<em>"像这样但又不是这样(like this but not this)"</em>模式</strong></p>
</div></div></div>
<p>
你可以通过首先搜索结构化字段，例如<code class="literal">category:adultMovie</code>，并在自定义文本“movie_description”字段中使用 significant_terms 来识别错误分类的内容。

使用建议的词(我会让你自己想象)，然后搜索所有<b>没有</b>标记为 category:adultMovie 但包含这些关键词的电影。

你现在有一个分类糟糕的电影的排名列表，你应该重新分类或至少从“familyFriendly”类别中删除。 
</p>
<p>
每个词项的重要性分数也可以提供一个有用的<code class="literal">boost</code>设置来对匹配进行排序。

使用带有关键字的<code class="literal">terms</code>查询的<code class="literal">minimum_should_match</code>设置将有助于控制结果集中的精确度/召回率的平衡，即高设置将使少量相关结果充满关键字，而设置“1”将产生包含<em>任何</em>关键字的所有文档的更详尽的结果集。
</p>
</div>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>
<strong>在上下文中显示 significant_terms</strong><br/>

自定义文本的 significant_terms 在上下文中更容易理解。

从自定义文本字段中获取<code class="literal">significant_terms</code>建议的结果，并在带有<code class="literal">highlight</code>子句的相同字段上的<code class="literal">terms</code>查询中使用它们，以向用户呈现文档的示例片段。

当词项不加词根、高亮显示、并以正确的大小写、正确的顺序和特定的上下文出现时，它们的重要性/意义就会更明显。 
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_custom_background_sets"></a>自定义背景集(Custom background sets)
</h3>
</div></div></div>
<p>
通常，前景文档集与索引中所有文档的背景集是“不同”的。

然而，有时使用较窄的背景集作为比较的基础可能证明是有用的。

例如，在包含世界各地内容的索引中查询与“Madrid”相关的文档，可能会发现“Spanish”是一个重要的词项。

这可能是真的，但是如果你想要一些更集中的词项，你可以对词项<em>spain</em>使用<code class="literal">background_filter</code>来建立一个更窄的文档集作为上下文。

有了这一背景，“Spanish”现在会被视为司空见惯的，因此没有像“capital”这样与Madrid联系更紧密的词那么重要。

请注意，使用 background_filter 会减慢速度——每个词项的背景频率现在必须从过滤发布列表中即时获得，而不是读取索引中为某个词项预先计算的计数。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_limitations_5"></a>局限性
</h3>
</div></div></div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_significant_terms_must_be_indexed_values"></a>重要词项必须是索引值
</h4>
</div></div></div>
<p>
与 terms 聚合不同，目前无法使用脚本生成的词项进行计数。

由于 significant_terms 聚合必须考虑<em>前景</em>和<em>背景</em>频率，因此在整个索引上使用脚本来获取背景频率进行比较的成本非常高。

出于类似的原因，文档值(DocValues)也不支持作为词项数据的来源。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_no_analysis_of_floating_point_fields"></a>不分析浮点(float)字段
</h4>
</div></div></div>
<p>
目前不支持浮点字段作为 significant_terms 分析的主题。

虽然整型(integer)或长整形(long)字段可用于表示银行账号或类别号等概念，跟踪这些概念可能会很有趣，但浮点型(float)字段通常用于表示数量。

因此，单个浮点项对于这种形式的频率分析没有用处。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_use_as_a_parent_aggregation"></a>作为父聚合(parent aggregation)使用
</h4>
</div></div></div>
<p>
如果存在<code class="literal">match_all</code>查询的等价查询，或者没有提供索引子集的查询标准，则 significant_terms 聚合不应用作最顶层的聚合——在这种情况下，<em>前景</em>集与<em>背景</em>集完全相同，因此在要观察的文档频率和从中做出合理建议的文档频率方面没有差异。
</p>
<p>
另一个考虑因素是 significant_terms 聚合在分片级别产生许多候选结果，这些结果只是在所有分片的所有统计信息合并后，在缩减节点(reducing node)上进行删减。

因此，从内存的角度来说，将大型子聚合嵌入到一个 significant_terms 聚合下是低效和昂贵的，这个聚合稍后会丢弃许多候选词项。 

在这些情况下，建议执行两次搜索——第一次是提供一个合理化的 significant_terms 列表，然后将这个词项列表添加到第二次查询中，以便返回并获取所需的子聚合。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_approximate_counts"></a>近似计数
</h4>
</div></div></div>
<p>结果中提供的包含某个词项的文档数是基于从每个分片返回的样本的总和，因此可能是：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
如果某些分片没有提供其前几个样本中给定词项的数字，则计数会偏低
</li>
<li class="listitem">
当考虑背景频率时，因为它可以计算在已删除文档中发现的出现次数，则计数会偏高
</li>
</ul>
</div>
<p>
像大多数设计决策一样，这是权衡的基础，我们选择以一些(通常很小的)不准确性为代价来提供高性能。

但是，下一节中介绍的<code class="literal">size</code>和<code class="literal">shard size</code>设置提供了帮助控制精度级别的工具。
</p>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_parameters_4"></a>参数
</h3>
</div></div></div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_jlh_score"></a>JLH 分数
</h4>
</div></div></div>
<p>通过添加参数，可以将JLH分数用作重要性分数</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">	 "jlh": {
	 }</pre>
</div>
<p>
分数是从<em>前景(foreground)</em>和<em>背景(background)</em>集中的文档频率得出的。

流行度的<em>绝对</em>变化(foregroundPercent - backgroundPercent)将有利于常见词项，而流行度的<em>相对</em>变化(foregroundPercent / backgroundPercent)将有利于罕见的词项。

罕见与常见本质上是精确与召回的平衡，因此绝对和相对变化被放大以提供精确和召回之间的最佳点。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_mutual_information"></a>交互信息(Mutual information)
</h4>
</div></div></div>
<p>在 Manning 等人的 "Information Retrieval" 第13.5.1章中描述的交互信息可以通过添加参数用作重要性分数</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">	 "mutual_information": {
	      "include_negatives": true
	 }</pre>
</div>
<p>
交互信息不区分描述子集或子集之外的文档的词项。

因此，重要的词项可以包含在子集内出现频率比在子集外出现频率高或低的词项。

要过滤掉子集中出现频率低于子集外文档的词项，可以将<code class="literal">include_negatives</code>设置为<code class="literal">false</code>。
</p>
<p>
默认情况下，假设桶中的文档也包含在背景中。

相反，如果你定义了一个自定义背景过滤器，它代表了你要比较的一组不同的文档，请设置:
</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"background_is_superset": false</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_chi_square"></a>卡方(Chi square)
</h4>
</div></div></div>
<p>如 Manning 等人在"Information Retrieval"第13.5.2章中述，卡方(Chi square)可以通过添加参数用作重要性分数:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">	 "chi_square": {
	 }</pre>
</div>
<p>卡方(Chi square)表现得像交互信息，并且可以用相同的参数<code class="literal">include_negatives</code>和<code class="literal">background_is_superset</code>来配置。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_google_normalized_distance"></a>标准Google距离(Google normalized distance)
</h4>
</div></div></div>
<p>如 Cilibrasi 和 Vitanyi 在2007年出版的"The Google Similarity Distance"(<a href="http://arxiv.org/pdf/cs/0412098v3.pdf" class="ulink" target="_top">http://arxiv.org/pdf/cs/0412098v3.pdf</a>)中所描述的，标准Google距离可以通过添加参数用作重要性分数:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">	 "gnd": {
	 }</pre>
</div>
<p>
<code class="literal">gnd</code>还接受参数<code class="literal">background_is_superset</code>
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_percentage"></a>百分比(Percentage)
</h4>
</div></div></div>
<p>
一个简单的计算方法，用前景样本中带有词项的文档数除以背景样本中带有词项的文档数。

默认情况下，这会产生一个大于0、小于1的分数。
</p>
<p>
这种启发式的好处是，评分逻辑很容易向熟悉“人均”统计数据的人解释。 

然而，对于高基数(high cardinality)的字段，这种试探倾向于选择最罕见的词项，例如只出现一次的错别字，因为它们的得分为 1/1 = 100%。
</p>
<p>
如果一个奖项完全基于获胜的比赛的百分比，一个经验丰富的拳击手很难赢得冠军——根据这些规则，一个只参加过一场比赛的新人是不可能被打败的。

通常需要多次观察来强化一个视图，因此在这些情况下，建议将<code class="literal">min_doc_count</code> 和 <code class="literal">shard_min_doc_count</code>都设置为更高的值，如 10，以便过滤掉优先出现的低频词项。 
</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">	 "percentage": {
	 }</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_which_one_is_best"></a>哪个是最好的?
</h4>
</div></div></div>
<p>
粗略地说，<code class="literal">mutual_information</code>偏好高频词项，即使它们在背景中也频繁出现。

例如，在自然语言文本的分析中，这可能导致停用词被选中。

<code class="literal">mutual_information</code>不太可能选择像拼写错误这样非常罕见的词项。

<code class="literal">gnd</code>偏好高频的共同出现的词项，避免选择停用词。

它可能更适合于同义词检测。

然而，<code class="literal">gnd</code>倾向于选择非常罕见的词项，例如，拼写错误的结果。

<code class="literal">chi_square</code>和<code class="literal">jlh</code>介于两者之间。
</p>
<p>
很难说不同的试探法中哪一种是最佳选择，因为这取决于重要词项的用途。

有关使用重要词项进行文本分类特征选择的研究的示例，请参考 Yang 和 Pedersen于1997年写的"<a href="http://courses.ischool.berkeley.edu/i256/f06/papers/yang97comparative.pdf" class="ulink" target="_top">A Comparative Study on Feature Selection in Text Categorization</a>"。
</p>
<p>如果上述方法都不适合你的用例，那么另一个选择是实施自定义重要性的判断方法:</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_scripted"></a>脚本化的(Scripted)
</h4>
</div></div></div>
<p>可以通过脚本实现自定义的分数：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">	    "script_heuristic": {
              "script": {
	        "lang": "painless",
	        "source": "params._subset_freq/(params._superset_freq - params._subset_freq + 1)"
	      }
            }</pre>
</div>
<p>
脚本可以是内联的(如上例)，索引或存储在磁盘上。

有关选项的详细信息，请参考 <a class="xref" href="modules-scripting.html" title="编写脚本" rel="nofollow">脚本文档</a>。
</p>
<p>脚本中可用的参数有：</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">_subset_freq</code>
</p>
</td>
<td valign="top">
<p>
词项在子集中出现的文档数。 
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">_superset_freq</code>
</p>
</td>
<td valign="top">
<p>
词项在超集中出现的文档数。 
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">_subset_size</code>
</p>
</td>
<td valign="top">
<p>
子集中的文档数量。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">_superset_size</code>
</p>
</td>
<td valign="top">
<p>
超集中的文档数。
</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="sig-terms-shard-size"></a>size 和 shard size
</h4>
</div></div></div>
<p>
可以设置参数<code class="literal">size</code>来定义应该从整个词项列表中返回多少个词项桶。

默认情况下，协调搜索过程的节点将请求每个分片提供各自的前几个词项桶，一旦所有分片做出响应，它将把结果缩减为最终列表，然后返回给客户端。

如果唯一的词项的数量大于<code class="literal">size</code>，则返回的列表可能稍有偏差且不准确(可能是词项计数稍有偏差，甚至可能是本应该是前<code class="literal">size</code>个桶中的词项没有返回)。
</p>
<p>
为了确保更好的准确性，使用最终<code class="literal">size</code>的倍数作为从每个分片请求的词项数(<code class="literal">2 * (size * 1.5 + 10)</code>)。

为了手动控制这个设置，可以使用参数<code class="literal">shard_size</code>来控制每个分片产生的候选词项的数量。
</p>
<p>
所有结果合并后，低频词项可能会成为最有趣的词项，因此当参数<code class="literal">shard_size</code>设置为明显高于<code class="literal">size</code>设置的值时，significant_terms聚合可以生成更高质量的结果。

这确保了在最终选择之前，缩减节点会对大量有希望的候选词项进行综合审查。

很明显，大的候选词项列表将导致额外的网络流量和内存使用，因此这是需要平衡的质量/成本权衡。

如果<code class="literal">shard_size</code>设置为-1(默认值)，那么<code class="literal">shard_size</code>将根据分片数量和<code class="literal">size</code>参数自动估算。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
<code class="literal">shard_size</code>不能小于<code class="literal">size</code>(因为没有太大意义)。

当出现这种情况时，Elasticsearch将覆盖它并将其重置为与<code class="literal">size</code>相等。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_minimum_document_count_2"></a>最小文档数量
</h4>
</div></div></div>
<p>使用<code class="literal">min_doc_count</code>选项可以只返回匹配超过配置的命中数的词项：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "aggs" : {
        "tags" : {
            "significant_terms" : {
                "field" : "tag",
                "min_doc_count": 10
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/514.console"></div>
<p>上面这个聚合将仅返回在10次或更多次点击中出现的tag。默认值为<code class="literal">3</code>。</p>
<p>
得分高的词项将在一个分片级别上进行收集，并在第二步中与从其他分片收集的词项合并。

然而，分片没有关于可用的全局词项频率的信息。

是否将一个词项添加到候选列表的决定只取决于使用局部分片频率在分片上计算的分数，而不是该词的全局频率。

<code class="literal">min_doc_count</code>标准仅在合并所有分片的本地词项统计之后应用。

在某种程度上，在没有非常<em>确定</em>该词项是否将实际达到所需的<code class="literal">min_doc_count</code>的情况下，就做出了将该词项添加为候选项的决定。

如果低频但得分高的词项填充了候选列表，这可能导致许多(全局)高频的词项在最终结果中丢失。

为了避免这种情况，可以增加<code class="literal">shard_size</code>参数，以允许分片上有更多的候选项。

但是，这会增加内存消耗和网络流量。
</p>
<p>
参数<code class="literal">shard_min_doc_count</code>
</p>
<p>
参数<code class="literal">shard_min_doc_count</code>规定了一个分片相对于<code class="literal">min_doc_count</code>是否应该被实际添加到候选列表中的<em>确定性</em>。

只有当词项在集合中的本地分片频率高于<code class="literal">shard_min_doc_count</code>时，才会考虑这些词项。

如果你的字典包含许多低频的单词，而你对这些单词不感兴趣(例如拼写错误)，那么你可以设置<code class="literal">shard_min_doc_count</code>参数来过滤掉分级别上的候选词，即使在合并本地频率之后，这些候选词也肯定不会达到所需的<code class="literal">min_doc_count</code>。

默认情况下，<code class="literal">shard_min_doc_count</code>设置为<code class="literal">1</code>，除非你显式设置它，否则它不起作用。
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
通常不建议将<code class="literal">min_doc_count</code>设置为<code class="literal">1</code>，因为它会返回拼写错误或其他奇怪的词。

找到一个词项的不止一个实例有助于强化这一点，尽管这种情况仍然很少见，但这个词项不是一次性事故的结果。

默认值 3 用于提供最小证据权重。 

<code class="literal">shard_min_doc_count</code>设置得太高会导致重要的候选词项在分片级别被过滤掉。

该值应设置为远低于 <code class="literal">min_doc_count/#shards</code>。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_custom_background_context"></a>自定义背景上下文
</h4>
</div></div></div>
<p>背景词项频率的统计信息的默认来源是整个索引，并且可以通过使用<code class="literal">background_filter</code>来缩小该范围，以便在更窄的上下文中聚焦于重要的词项：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query" : {
        "match" : {
            "city" : "madrid"
        }
    },
    "aggs" : {
        "tags" : {
            "significant_terms" : {
                "field" : "tag",
                "background_filter": {
                	"term" : { "text" : "spain"}
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/515.console"></div>
<p>上述过滤器将有助于集中在 Madrid 市特有的词项上，而不是显示诸如“Spanish”的词项，这些词项在完整索引的全局上下文中是不常见的，但是在包含单词“Spain”的文档子集中是常见的。</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>使用背景过滤器会降低查询速度，因为必须过滤每个词的帖子来确定频率</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_filtering_values_2"></a>过滤值
</h4>
</div></div></div>
<p>
可以(尽管很少需要)过滤将为其创建桶的值。

这可以使用基于正则表达式字符串或精确项数组的<code class="literal">include</code>和<code class="literal">exclude</code>参数来完成。

此功能反映了<a class="xref" href="search-aggregations-bucket-terms-aggregation.html" title="terms 聚合" rel="nofollow">terms聚合</a>文档中描述的功能。
</p>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_collect_mode"></a>回收模式
</h3>
</div></div></div>
<p>
为了避免内存问题，<code class="literal">significant_terms</code>聚合始终以 广度优先(<code class="literal">breadth_first</code>) 模式计算子聚合。

不同收集模式的描述可以在<a class="xref" href="search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-collect" title="回收模式" rel="nofollow">terms聚合</a>文档中找到。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_execution_hint_2"></a>执行机制(execution hint)
</h3>
</div></div></div>
<p>
可以通过不同的机制来执行词项聚合(terms aggregation):
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
通过直接使用字段值来聚合每个桶的数据 (<code class="literal">map</code>)
</li>
<li class="listitem">
通过使用字段的全局序数并为每个全局序数分配一个桶 (<code class="literal">global_ordinals</code>)
</li>
</ul>
</div>
<p>
Elasticsearch会尝试使用合理的默认值，所以这通常不需要配置。
</p>
<p>
<code class="literal">global_ordinals</code>是<code class="literal">keyword</code>类型字段的默认选项，它使用全局序数来动态分配桶，因此内存使用量与聚合范围内的文档值的数量成线性关系。
</p>
<p>
只有当很少文档与查询匹配时，才应该考虑<code class="literal">map</code>。

否则，基于序数的执行模式要快得多。

默认情况下，<code class="literal">map</code>仅在脚本上运行聚合时使用，因为它们没有序号。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "aggs" : {
        "tags" : {
             "significant_terms" : {
                 "field" : "tags",
                 "execution_hint": "map" <a id="CO241-1"></a><i class="conum" data-value="1"></i>
             }
         }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/516.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO241-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>可能的值有<code class="literal">map</code>、<code class="literal">global_ordinals</code></p>
</td>
</tr>
</table>
</div>
<p>请注意，如果不适用，Elasticsearch将忽略这个执行机制(execution_hint)。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="search-aggregations-bucket-sampler-aggregation.html">« sampler 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-bucket-significanttext-aggregation.html">significant_text 聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>